import { ArrayMinSize, IsArray, IsDate, IsNotEmpty } from 'class-validator';
import { Type } from 'class-transformer';

// name、author、publishTime、publisher、pages、description、types、tags、price、discountPrice、stock、poster
class Book {
    @IsNotEmpty({ message: '书名不可以为空' })
    // 运行时的类型约束
    @Type(() => String)
    public name!: string;

    @IsNotEmpty({ message: '描述不可以为空' })
    @Type(() => String)
    public description!: string;

    @IsNotEmpty({ message: '作者不可以为空' })
    @Type(() => String)
    public author!: string;

    @IsNotEmpty({ message: '出版社不可以为空' })
    @Type(() => String)
    public publisher!: string;

    @IsNotEmpty({ message: '出版日期不可以为空' })
    @IsDate()
    @Type(() => Date)
    public publishDate!: Date;

    @IsNotEmpty({ message: '页数不可以为空' })
    @Type(() => Number)
    public pages!: number;

    @IsNotEmpty({ message: '标签不可以为空' })
    @ArrayMinSize(1, { message: '标签至少有一个' })
    // 文档建议如果是字符串的数组，使用字符串约束更好，因为js其实不存在数字数组，字符串数组等
    @Type(() => String)
    // 上面虽然解决了不是字符串的数组的问题，但是如果传进来的是一个字符串呢？这就太tm难了，所以再在编译时检查一下算了吧，运行时不管了
    @IsArray({ message: '标签必须是一个数组' })
    public tags!: string[];

    @IsNotEmpty({ message: '类别不可以为空' })
    @ArrayMinSize(1, { message: '类别至少有一个' })
    @Type(() => String)
    @IsArray({ message: '类别必须是一个数组' })
    public types!: string[];

    @IsNotEmpty({ message: '价格不可以为空' })
    @Type(() => Number)
    public price!: number;

    @Type(() => Number)
    public discountPrice?: number;

    @IsNotEmpty({ message: '库存不可以为空' })
    @Type(() => Number)
    public stock!: number;

    @Type(() => String)
    public poster!: string;
}

export default Book;
